سؤال

مرحبا، لدي الكود التالي:

- (IBAction)runTask:(id)sender {
    NSTask *proc;
    NSPipe *output;
    NSData *data;
    NSString *buffer;

    proc = [[NSTask alloc] init];
    output = [[NSPipe alloc] init];

    [proc setLaunchPath:@"/bin/sh"];
    [proc setArguments:[NSArray arrayWithObjects: @"-c", @"/usr/bin/otool -L /Applications/TextEdit.app/Contents/MacOS/TextEdit | /usr/bin/awk 'NR>1{print $1}' | /usr/bin/sed -e '/@executable_path/d' -e 's/(.*)$//' -e  's/\\/Versions.*$//'", nil]];
    [proc launch];

    data = [[output fileHandleForReading] readDataToEndOfFile];
    buffer = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
    NSLog(@"got: %@", buffer);

     // Release
     [proc release];
     [output release];
     [buffer release];
     [data release];
}

الغرض من الرموز هو كيندا معقدة، ويستخدم Otool للحصول على قائمة بالمكتبات المشتركة المستخدمة من قبل ثنائي ثم يستخدم SED و AWK لتصفيةها في تنسيق قابل للقراءة الجهاز. فقط لاختبار لقد استخدمت ثنائي ماك OS X TextEdit.App.

المشكلة هي أن الرمز يعمل وإرجاع إخراج ولكن ثم يتجمد التطبيق. ذهبت من خلال خطها حسب الخط ووجدت هذا الخط ليكون المشكلة:

البيانات = [[إخراج filehandleforreading] readdatatoendoffile]؛

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

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

المحلول 2

الحل لهذه المشكلة كان بسيطا،

في ظلة معروفة أنه بعد تنفيذ NSTASK، لا يعمل جميع التسجيل. إنه عائد إخراج، ليس فقط تسجيله. كان الحل هو إضافة هذا الخط:

[task setStandardInput:[NSPipe pipe]];

وكل شيء يعمل بشكل جيد :)

نصائح أخرى

يبدو أنك في عداد المفقودين

[proc setStandardOutput:output];

لديك مائل إضافي في نهاية بيان SED الأخير. بمجرد إزالته، يعمل البرنامج النصي بشكل جيد.

يجب إنشاء الإخراج باستخدام [الأنابيب NSPIPE] (غير ملخص) ثم يجب تعيين الإخراج كإخراج قياسي باستخدام [Proc SetStandardOuttoutPut: الإخراج

ولكن السبب في أنك تعطل هو أن تقوم بإصدار البيانات التي لم تعلن عنها، جديدة أو نسخ. انظر قواعد إدارة الذاكرة.

انظر أيضا سريعة ل nstask. لتنفيذ نظيف لطيف لهذا الرمز.

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