سؤال

محاولة جعل nsobject يسمى "الشخص" الذي سيعقد تفاصيل تسجيل الدخول للتطبيق الخاص بي (لا شيء يتوهم). يتكون التطبيق من وحدة تحكم ملاحة مع طرق عرض طاولة متعددة ولكني أواجه مشكلات تقاسم كائن الشخص حولها.

حاول إنشاء كائن ثابت مثل هذا:

+ (Person *)sharedInstance {
    static Person *sharedInstance;
    @synchronized(self) {
        if(!sharedInstance)
            sharedInstance = [[Person alloc] init];
        return sharedInstance;
    }
    return nil;
}

وهنا هو الرأس

// Person.h
#import <Foundation/Foundation.h>

@interface Person : NSObject {

    NSString    *fullName;
    NSString    *firstName;
    NSString    *lastName;
    NSString    *mobileNumber;
    NSString    *userPassword;
}

@property(nonatomic, retain) NSString   *fullName;
@property(nonatomic, retain) NSString   *firstName;
@property(nonatomic, retain) NSString   *lastName;
@property(nonatomic, retain) NSString   *mobileNumber;
@property(nonatomic, retain) NSString   *userPassword;

+ (Person *)sharedInstance;
-(BOOL) setName:(NSString*) fname;
-(BOOL) setMob:(NSString*) mnum;
-(BOOL) setPass:(NSString*) pwd;

@end

هناك حاجة إلى هذه الكائنات والآجيلة في أجزاء مختلفة من التطبيق. لقد كنت أحاول الوصول إليها مثل هذا

Person * ThePerson = [[Person alloc] init];
ThePerson = nil;
NSString * PersonsName;
PersonsName = [[Person sharedInstance] firstName];

كل شيء يعمل بشكل جيد في شاشة تسجيل الدخول ولكنه يموت في الاستخدام التالي. عادة exc_bad_access (eek!).

من الواضح أنني أفعل شيئا خاطئا جدا هنا. هل هناك طريقة أسهل لمشاركة الكائنات بين مختلف وحدات تحكم عرض عدد (كلاهما مشفرة و XIB)؟

هل كانت مفيدة؟

المحلول

لماذا لا تخزن هذه المعلومات في NSUserDefaults أو المفاتيح؟

نصائح أخرى

لك +sharedInstance طريقة إرجاع nil عندما يجب أن تعيد المثيل المشترك. أيضا، أشك في أن هناك أي قيمة لمزامنة هذه الكتلة. يمكن كتابة الطريقة ببساطة:

+ (Person *)sharedInstance {
    static Person *sharedInstance;
    if(!sharedInstance) {
        sharedInstance = [[Person alloc] init];
    }
    return sharedInstance;
}

لاحظ أن هذا لا ينشئ "كائن ثابت"، لأنه لا يوجد شيء من هذا القبيل في الهدف - ج؛ إنه يعين مجرد كائن متغير ثابت (ربما ما قصدته، ولكن أردت فقط أن تتأكد).

هناك طريقة أخرى لمشاركة كائن من بين وحدات تحكم رأي أو أكثر ضمن وحدة تحكم التنقل هي إضافة خاصية إلى وحدات تحكم العرض المتداخلة، ثم استدعاء طريقة STERTER قبل التنقل. على سبيل المثال، يمكنك إضافة خاصية مثل ما يلي:

@property (nonatomic, retain) Book *book;

إلى طفل من وحدة تحكم الرؤية الجذر، وإرسالها -setBook: رسالة في وحدة تحكم عرض الجذر -tableView:didSelectRowAtIndexPath: طريقة.

أنت لا تستخدم نمط المثيل المشترك بشكل صحيح. يجب أن تقوم طريقة ShareDinstance الخاصة بك ALLOC وبدء شخص جديد (إذا لم يتم ذلك بالفعل مرة واحدة) وتعيينه إلى المتغير الثابت ShareDinstance.

ثم عندما تحتاج إلى مؤشر للشخص، يجب عليك استخدام طريقة فئة المثيل المشتركة، وليس ALLOC و INIT مثيل جديد بنفسك.

من الناحية الفنية، إذا كنت تذهب إلى Singleton في مهذب كامل، فلا ينبغي أن تسمح طريقة ALLOC بإنشاء مثيل جديد للشخص.

أيضا، أنا فقط أعد قراءة التعليمات البرمجية الخاصة بك، واتصلت قليلا من WTF:

Person * ThePerson = [[Person alloc] init];
ThePerson = nil;

ما هو كل شيء عن؟ هذا تسرب الذاكرة، هناك حق.

يمكن حل جميع مشاكلك عن طريق استبدال أي وجميع خطوط Person *thePerson = [[Person alloc] init]; مع Person *person = [Person sharedInstance];

INIT الخاص بك هو Hinky، إذا كنت ترغب في تعيين الاسم الأول للشخص هل هذا مثل هذا

Person *thePerson = [Person sharedInstance];  
thePerson.name = @"John Public";

للحصول على الاسم خارج،

NSString *personName = [[Person sharedInstance] name];  

التي ستعمل في أي فئة #MPorts "شخص"

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top