كيفية نقل غير ثابت المتغيرات من واجهة التنفيذ في objectiveC?

StackOverflow https://stackoverflow.com/questions/1470853

سؤال

أنا أحاول أن أكتب الكاكاو لمسة مكتبة ثابتة.أن يبقيه بسيط كنت تفضل عدم استخدام المتغيرات الخاصة داخل واجهة الملف.قانون الآن يبدو مثل هذا:

واجهة الملف (myView.h):

@interface myView: UIView {

NSTimer * myTimer;

}

@end

تنفيذ ملف (myView.ح)

@implementation myView

@end

هذا NSTimer المؤشر هو متغير الخاص لذلك حاولت هذه:(لا يعمل)

واجهة الملف (myView.h):

@interface myView: UIView {

}

@end

تنفيذ ملف (myView.ح)

NSTimer * myTimer;

@implementation myView

@end

يبدو أن العمل ومع ذلك اتضح ان الموقت هو الآن متغير ثابت.

أفعل لك شيء خاطئ أو لا يوجد حل ؟

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

المحلول

لا يمكنك تحديد المتغيرات سبيل المثال في ملف التنفيذ.

أحد الحلول الممكنة هو أن يكون بنية خاصة التي تحتوي على المتغيرات الخاصة و أعلن على الملأ خاصة متغير يشير إلى هذا الهيكل الخاص:

@interface MyView {
   void *privateData;
}

تنفيذ الملف:

typedef struct {
   NSTimer *myTimer;
}  PrivateData;


@implementation MyView()

@property (readonly) PrivateData *privateData;

@end


@implementation MyView

- (id) init {
   if (self = [super init]) {
       privateData = malloc(sizeof(PrivateData));

       self.privateData->myTimer = nil; // or something else
   } 

   return self;
}

-(PrivateData *) privateData {
    return (PrivateData *) self->privateData;
}

- (void) myMethod {
   NSTimer *timer = self.privateData->myTimer;
}

- (void) dealloc {
    // release stuff inside PrivateData
    free(privateData);
    [super dealloc];
}

@end

انها ليست جميلة ، لكنه يعمل.ربما هناك حلول أفضل.

نصائح أخرى

مجرد ملاحظة؛ تحاول إخفاء إيفار من أجل الأمن سخيفة. لا تهتم.

من أجل البساطة، على الرغم من أنها لها قيمة.

ومع ذلك، بضع حلول:

(1) إذا استهداف جهاز تشغيل iPhone أو 64 بت الكاكاو، يمكنك @ @ ivar:

foo.h:

@interface Foo:NSObject
@property(readwrite, copy) NSString *publiclyReadwriteNoiVar;
@property(readonly, copy) NSString *publiclyReadonlyPrivatelyReadwriteNoiVar;
@end

foo.m:

@interface Foo()
@property(readwrite, copy) NSString *privateProperty;
@end

@implementation Foo
@synthesize publiclyReadwriteNoiVar, publiclyReadonlyPrivatelyReadwriteNoiVar, privateProperty;
@end

(2) استخدام فرعية فرعية خاصة كيندا مثل مجموعات الفئة:

foo.h:

@interface Foo:NSObject
@end

foo.m:

@interface RealFoo:Foo
{
    .... ivars here ....
}
@end
@implementation RealFoo
@end

@implementation Foo
+ (Foo *) convenienceMethodThatCreatesFoo
{
   .... realFoo = [[RealFoo alloc] init]; ....
   return realFoo;
}
@end

اعتمادا على هدف التغليف الخاص بك، هناك أيضا التوجيهPrive التوجيه:

وصول المعدلات

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